home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Screenblankers / GBlanker / GSource / Blankers / MostlyDark / blank.c next >
C/C++ Source or Header  |  1996-09-26  |  7KB  |  344 lines

  1. /*
  2. **             MostlyDark Blanker
  3. **
  4. **        Copyright © 1995 by Marzio De Biasi
  5. **
  6. **
  7. **    Source:        blank.c
  8. **    Language:    ANSI C
  9. **    Version:    1.0
  10. **    Description:    a module for GarshneBlanker v38.8 modular screen
  11. **            blanker by Micheal D. Bayne, see MostlyDark.doc for
  12. **            further details.
  13. **    Last update:    13 Feb 95        
  14. **    Author:        De Biasi Marzio
  15. **            Address: via Borgo Simoi, 34
  16. **                 31029 Vittorio Veneto (TV)
  17. **                 Italy
  18. **            E-Mail:  debiasi@dimi.uniud.it
  19. **
  20. **    History:    
  21. **
  22. **    ->
  23. **
  24. */
  25.  
  26. #include "/includes.h"
  27.  
  28. #include <math.h>
  29. #include <time.h>
  30. #include <stdio.h>
  31. #include <stdlib.h>
  32.  
  33. #include "MostlyDark_rev.h"
  34. STATIC const UBYTE VersTag[] = VERSTAG;
  35.  
  36. #define PREF_DENS    0
  37. #define PREF_DELAY    2
  38. #define MODE        4
  39.  
  40. /* ---- screen-oriented variables ------------------------------------ */
  41.  
  42. LONG Hei, Wid;
  43. Triplet *ColorTable = 0L;
  44. WORD Cl;
  45.  
  46. struct Screen     *pubDrk_sc;
  47. struct RastPort *pubDrk_rp;
  48.  
  49. WORD    pubDrk_w, pubDrk_h;
  50.  
  51.  
  52. /* ---- blanker-oriented variables ----------------------------------- */
  53.  
  54. #include "MostlyDark.h"
  55.  
  56. WORD        pubDrk_nb = 0, pubDrk_totb = 80;
  57. struct List    pubDrk_blobs;
  58.  
  59. LONG    pubDrk_delay = 0;
  60. LONG     pubDrk_dens;
  61.  
  62.  
  63.  
  64.  
  65. /* ------------------------------------------------------------------- */
  66. /* ---- Defaults() --------------------------------------------------- */
  67. /* ------------------------------------------------------------------- */
  68.  
  69. VOID Defaults( PrefObject *Prefs )
  70. {
  71.     Prefs[PREF_DENS].po_Level = 7;
  72.     Prefs[PREF_DELAY].po_Level = 2;
  73.     Prefs[MODE].po_ModeID = (getTopScreenMode() & MONITOR_ID_MASK) | LORES_KEY;
  74.     Prefs[MODE].po_Depth = 5;
  75. }
  76.  
  77.  
  78.  
  79.  
  80. /* ------------------------------------------------------------------- */
  81. /* ---- RefreshBlob() ------------------------------------------------ */
  82. /* ------------------------------------------------------------------- */
  83.  
  84. BOOL    RefreshBlob(Blob_t *b) {
  85.  
  86.     if (b->inc_f) {
  87.  
  88.     if (b->c < Cl - 1) {
  89.         b->c++;
  90.         SetAPen(pubDrk_rp, b->c);
  91.         WritePixel(pubDrk_rp, b->x, b->y);
  92.     }
  93.     else
  94.         b->inc_f = FALSE;
  95.     
  96.     return(TRUE);
  97.     }
  98.     else {
  99.     if (b->c > 0) {
  100.         b->c--;
  101.         SetAPen(pubDrk_rp, b->c);
  102.         WritePixel(pubDrk_rp, b->x, b->y);
  103.         return(TRUE);
  104.     }
  105.     else
  106.         return(FALSE);
  107.     }
  108. }
  109.  
  110.  
  111.  
  112.  
  113. /* ------------------------------------------------------------------- */
  114. /* ---- InitBlob() --------------------------------------------------- */
  115. /* ------------------------------------------------------------------- */
  116.  
  117. void    InitBlob(Blob_t *b) {
  118.  
  119.     b->nod.ln_Type = NT_USER;
  120.  
  121.     while(TRUE) {
  122.     b->x = lrand48() % Wid;
  123.         b->y = lrand48() % Hei;
  124.     if (ReadPixel(pubDrk_rp,b->x,b->y)==0) break;
  125.     }
  126.     b->c = 0;
  127.     b->inc_f = TRUE; 
  128. }
  129.  
  130.  
  131.  
  132.  
  133. /* ------------------------------------------------------------------- */
  134. /* ---- MostlyDarkDriver() ------------------------------------------- */
  135. /* ------------------------------------------------------------------- */
  136.  
  137. LONG    MostlyDarkDriver( void ) {
  138.  
  139.     LONG    RetVal = OK;
  140.     ULONG    scrt, scr2front = 0;
  141.     WORD    i;
  142.     ULONG    *ctab, c;
  143.     UBYTE    rf, gf, bf;
  144.     UWORD    *OldCTab;
  145.     float    dum;
  146.     Blob_t    *nb, *t;
  147.  
  148.     pubDrk_nb = 0;
  149.    
  150.     scrt = (pubDrk_delay == 0)? 5000 : 500 / pubDrk_delay; 
  151.  
  152.     pubDrk_blobs.lh_Type = NT_USER;
  153.     pubDrk_blobs.lh_Head = &pubDrk_blobs.lh_Tail;
  154.     pubDrk_blobs.lh_Tail = NULL;
  155.     pubDrk_blobs.lh_TailPred = &pubDrk_blobs.lh_Head;
  156.  
  157.  
  158. /*    ctab = NULL; */
  159.     ctab = GetColorTable(pubDrk_sc); 
  160.  
  161.     rf = 1;
  162.     gf = 1;
  163.     bf = 1;
  164.  
  165.     if (ctab) {
  166.  
  167.         ctab[1] = 0;
  168.         ctab[2] = 0;
  169.         ctab[3] = 0;
  170.  
  171.     dum = 255.0/(Cl-2);
  172.  
  173.         for (i = 1; i < Cl ; i++) {
  174.  
  175.         c = (i - 1) * dum;
  176.         c &= 0xFF;
  177.  
  178.         c = c | (c << 8) | (c << 16) | (c<<24);
  179.  
  180.         ctab[i*3+1] = c * rf;             
  181.         ctab[i*3+2] = c * gf;             
  182.         ctab[i*3+3] = c * bf;             
  183.     }
  184.  
  185.         LoadRGB32(&(pubDrk_sc->ViewPort), ctab);
  186.     }
  187.     else {
  188.  
  189.     OldCTab = (pubDrk_sc->ViewPort.ColorMap)->ColorTable;
  190.     OldCTab[0] = 0;
  191.  
  192.     dum = 15.0/(Cl-2);
  193.  
  194.     if (dum == 0) dum = 1;
  195.  
  196.         for (i = 1; i < Cl; i++) {
  197.  
  198.         c = (i - 1) * dum;
  199.         if (c > 0xF) c = 0xF;
  200.         c &= 0xF;
  201.  
  202.         if (gf)  c |= (c << 4);
  203.         if (bf)  c |= (c << 8);
  204.         if (!rf) c &= 0xFF0;
  205.         
  206.         OldCTab[i] = c;             
  207.     }
  208.         LoadRGB4(&(pubDrk_sc->ViewPort), OldCTab, Cl);
  209.     }
  210.  
  211. /*
  212.     for (i = 0; i < Cl; i++) {
  213.     SetAPen(pubDrk_rp,i);
  214.     RectFill(pubDrk_rp,i*20,20,i*20+20,40);
  215.     }
  216. */
  217.  
  218.     while (RetVal == OK) {
  219.  
  220.  
  221.     if ((scr2front++ % scrt) == 0) ScreenToFront(pubDrk_sc); 
  222.  
  223.  
  224.     for (i = 0; i < pubDrk_delay; i++) WaitTOF();
  225.  
  226.  
  227.     /* shall we add a new blob? */
  228.  
  229.     if (pubDrk_dens < 6) {
  230.         if ((lrand48() % (6 - pubDrk_dens)) == 0) {
  231.  
  232.             if ((nb = (Blob_t *)malloc(sizeof(Blob_t))) != NULL) {
  233.             pubDrk_nb++;
  234.             InitBlob(nb);
  235.             AddHead(&pubDrk_blobs, nb);
  236.             }
  237.         }
  238.     }
  239.     else for (i = 0; i < pubDrk_dens - 4; i++) {
  240.  
  241.         if ((nb = (Blob_t *)malloc(sizeof(Blob_t))) != NULL) {
  242.  
  243.         pubDrk_nb++;
  244.         InitBlob(nb);
  245.         AddHead(&pubDrk_blobs, nb);
  246.         }
  247.     } 
  248.  
  249.  
  250.     /* refresh all blobs */
  251.  
  252.     nb = pubDrk_blobs.lh_Head;
  253.  
  254.     while (nb->nod.ln_Succ != NULL) {
  255.  
  256.         if (!RefreshBlob(nb)) {
  257.         t = nb->nod.ln_Succ;
  258.         Remove(nb);
  259.         free(nb);
  260.         nb = t;
  261.         pubDrk_nb--;
  262.         }
  263.         else {
  264.         nb = nb->nod.ln_Succ;
  265.         }
  266.     }
  267.  
  268.         if ((RetVal = ContinueBlanking()) != OK) break;
  269.     }
  270.  
  271.     /* free blob list */
  272.     nb = pubDrk_blobs.lh_Head;
  273.     while (nb->ln_Succ != NULL) {
  274.     t = nb->nod.ln_Succ;
  275.     Remove(nb);
  276.     free(nb);
  277.     nb = t;
  278.     pubDrk_nb--;
  279.     } 
  280.  
  281.     if (ctab) FreeVec(ctab); 
  282.  
  283.     return(RetVal);
  284. }
  285.  
  286.  
  287.  
  288.  
  289. /* ------------------------------------------------------------------- */
  290. /* ---- Blank() ------------------------------------------------------ */
  291. /* ------------------------------------------------------------------- */
  292.  
  293. LONG Blank( PrefObject *Prefs )
  294. {
  295. /*
  296. **  Opens screen, initializes color table, preference values and random
  297. **  numbers generator seed, then call <AntDriver()>.
  298. */
  299.     struct Window *Wnd;
  300.     LONG  RetVal;
  301.  
  302.     srand48(time(0L));
  303.  
  304.  
  305.     pubDrk_sc = OpenScreenTags( NULL, SA_Depth, Prefs[MODE].po_Depth, SA_Quiet, TRUE,
  306.                          SA_DisplayID, Prefs[MODE].po_ModeID, SA_Behind, TRUE,
  307.                          SA_Overscan, OSCAN_STANDARD, TAG_DONE );
  308.  
  309.     if( pubDrk_sc )
  310.     {
  311.  
  312.         ScreenToFront(pubDrk_sc);
  313.  
  314.         pubDrk_rp = &pubDrk_sc->RastPort;
  315.  
  316.         Cl = 1L << Prefs[MODE].po_Depth;
  317.  
  318.         pubDrk_delay = Prefs[PREF_DELAY].po_Level & 0xFFFF;
  319.         pubDrk_dens = Prefs[PREF_DENS].po_Level;
  320.  
  321.         
  322.         Wid = pubDrk_sc->Width;
  323.         Hei = pubDrk_sc->Height;
  324.  
  325.  
  326. /*            ColorTable = RainbowPalette( pubDrk_sc, 0L, 1L, 0L );  */
  327.  
  328.         Wnd = BlankMousePointer( pubDrk_sc );
  329.         
  330.     
  331.  
  332.         RetVal = MostlyDarkDriver();
  333.  
  334.         UnblankMousePointer( Wnd );
  335. /*        RainbowPalette( 0L, ColorTable, 1L, 0L );    */
  336.  
  337.         CloseScreen( pubDrk_sc );
  338.     }
  339.     else
  340.         RetVal = FAILED;
  341.     
  342.     return(RetVal);
  343. }
  344.